const jwt = require("jsonwebtoken"); // 🔗:api https://github.com/auth0/node-jsonwebtoken
const { uuid } = require("../config/config.default"); // uuid为签名
const { promisify } = require("util"); //将 callback 转化为promise类型 不用在回调函数中等结果 直接 async await xx 参考文章:https://www.jianshu.com/p/b3092ef11321
const sign = promisify(jwt.sign); // 转为 promise 调用模式 (不转也可以 只是不好看 不可以使用 await ...)
const verify = promisify(jwt.verify); //转为 promise 调用模式(不转也可以 只是不好看 不可以使用 await ...)

//生成token
module.exports.createToken = async (userInfo) => {
  const token = await sign({ userInfo }, uuid, { expiresIn: 60 * 60 * 24 * 7 }); //设置需要转化的用户信息、有效时间(7天)、签名
  return token;
};

//校验token
// 校验token应该是一个中间件 token校验成功则继续走后续的路由逻辑，校验失败则提示token相关错误信息
module.exports.verifyToken = async (req, res, next) => {
  const token = req.headers["authorization"];
  if (token) {
    const tokenVal = token.split("Bearer ")[1];
    try {
      const userInfo = await jwt.verify(tokenVal, uuid);
      req.user = userInfo //返回解析出来的用户信息
      if (userInfo) {
        next(); //认证成功
      } else {
        res.status(401).send({ error: "Token过期或者错误!" });
      }
    } catch (error) {
        res.status(401).send({ error: "Token过期或者错误!" });
    }
  } else {
    res.status(401).send({ error: "Token不能为空!" });
  }
};
